nginx で User-Agent 制限を掛けて攻撃をブロックする

サーバー設定

nginx 1.10.3 で、User-Agent をキーにしたアクセス制限の方法を解説します。
今回利用した環境の詳細は以下の通りです。

  • Ubuntu 16.04.4
  • nginx 1.10.3

User-Agent アクセス制限(Apache 編)



User-Agent でアクセス制限を掛ける意図

User-Agent を利用してアクセス制限を掛ける場合は、大きく2パターンが存在します。

アクセス制限の2パターン

  • 特定の User-Agent のみ許可する
  • 特定の User-Agent を拒否する

前者はホワイトリスト方式で、特定アプリケーションのみ接続を許可したい場合に利用します。
スマートフォンアプリの API などで見かける方式です。

後者はブラックリスト方式で、攻撃アクセスや脆弱性スキャンなどをブロックする際に有効です。

 
今回は後者の「拒否パターン」を検証します。
User-Agent はいくらでも偽装が可能なため、本気で狙われた際には効果がありませんが、特定のスキャンツールを防ぐ観点では一定の効果が見込めます。

nginx で User-Agent によるアクセス制限を掛ける

今回は Mozilla/5.0 Jorgee という User-Agent を拒否してみます。
この User-Agent は脆弱性スキャンツールなどで利用されています。

nginx の設定ファイルに以下の記述を追加します。
追記する先は、server セクションの中であればどの設定ファイルでも構いません。

if ($http_user_agent = "Mozilla/5.0 Jorgee"){
  return 403;
}

上記の例では 403 を返していますが、他のステータスコードも指定可能です。

比較演算子は以下の通りです。用途に応じて適切な比較演算子を利用しましょう。

  • = : 完全一致で比較
  • ~ : 正規表現で比較
  • ~* : 大文字/小文字を区別しない正規表現で比較

nginx のアクセス制限を確認する

まずは、nginx をリロードして設定を反映します。
OS によってコマンドが異なるため注意しましょう。

// Ubuntu や CentOS 7系の場合
$ sudo systemctl reload nginx

// CentOS 6系の場合
$ sudo service nginx reload

curl コマンドを使用してアクセスします。200 が返ってくれば問題なしです。
アクセス先の URL は環境に応じて修正してください。

$ curl -I http://<サーバー IP>/
HTTP/1.1 200 OK

次に、拒否設定した User-Agent を使ってアクセスしてみます。
403 はアクセス拒否を示しています。

$ curl -H "User-Agent: Mozilla/5.0 Jorgee" -I http://<サーバー IP>/
HTTP/1.1 403 Forbidden

User-Agent によってブロックされることを確認できました。

まとめ

nginx で、User-Agent によるアクセス制限の方法を紹介しました。
if 文ひとつで簡単に設定することができます。

拒否以外の使い方でも応用が可能です。
スマートフォンの User-Agent はモバイル版にリダイレクト」といった処理も実現できます。

様々な条件でアクセスを制御できるため、ぜひご活用ください。

【関連記事】
Webサイトの不正アクセス防止
Apache, nginx, H2O の特徴を比較
nginx のインストール手順 (CentOS)
nginx に繋がらない場合の調査方法
nginx が起動しない場合の対処方法